perm filename PIXLIB.SAI[VIS,HPM] blob sn#178261 filedate 1975-10-12 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00008 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	entry pixdim,pfldim,getpfl,putpfl,campix,makpix
C00003 00003	internal INTEGER PROCEDURE PFLDIM(STRING FILNAM)
C00008 00004	internal INTEGER PROCEDURE GETPFL(STRING FILNAM REFERENCE INTEGER PICTURE)
C00013 00005	internal INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS)
C00015 00006	internal INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE STRING FILNAM)
C00018 00007	internal INTEGER PROCEDURE CAMPIX(INTEGER CAMRA,YEDGE,XEDGE,SUMS,CLPINC
C00022 00008	end
C00024 ENDMK
C⊗;
entry pixdim,pfldim,getpfl,putpfl,campix,makpix;

begin

EXTERNAL PROCEDURE MAKTAB(REFERENCE INTEGER PICTURE);

STRING PROCEDURE DEV(STRING FILSPEC);
      BEGIN
      STRING S,T;
      INTEGER I;
      S←FILSPEC;
      T←"";
      WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
      RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
      END;

STRING PROCEDURE NAM(STRING FILSPEC);
      BEGIN
      STRING S,T;
      INTEGER I;
      S←FILSPEC;
      WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
      RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
      END;
internal INTEGER PROCEDURE PFLDIM(STRING FILNAM);
  comment  returns the size of the picture FILNAM on disk.
		used for allocating arrays in preparation for
		actually reading them. Returns 0 on failure.;
   BEGIN
   INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
   INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
   INTEGER ARRAY BUF[0:'177];

   OPEN(10,DEV(FILNAM),'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
   LOOKUP(10,NAM(FILNAM),XXFLAG);
   IF XXFLAG THEN
      BEGIN
      CLOSE(10);
      RETURN(0);
      END
   ELSE
      BEGIN
      INTEGER K,KK;
      ARRYIN(10,BUF[0],'200); CLOSE(10);
      IF BUF[0]=-1 THEN
         BEGIN
         KK←0;
         FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←K;
         IF KK=0 THEN RETURN(0);
         BYBI←BUF[1];
         LNBY←BUF[6]-BUF[5]+1;
         PCLN←BUF[4]-BUF[3]+1;
         LNWD←BUF[2];
         LNBYA←LNWD*(36%BYBI);
         PCWD←LNWD*PCLN;
         RETURN(12+PCLN+LNBYA+PCWD);
         END
      ELSE
         BEGIN
         BYBI←BUF[2];
         LNBY←BUF[8]-BUF[7]+1;
         PCLN←BUF[6]-BUF[5]+1;
         WDBY←36%BYBI;
         LNWD←(LNBY+WDBY-1)%WDBY;
         LNBYA←LNWD*WDBY;
         PCWD←PCLN*LNWD;
         PCBY←PCLN*LNBY;
         PCBYA←PCLN*LNBYA;
         WDBI←WDBY*BYBI;
         IF BYBI≤0 ∨ BYBI>36 ∨ LNBY≤0 ∨ PCLN≤0 ∨ BUF[0]<0 THEN RETURN(0)
         ELSE RETURN(12+PCLN+LNBYA+PCWD);
         END;
      END;
   END;
internal INTEGER PROCEDURE GETPFL(STRING FILNAM; REFERENCE INTEGER PICTURE);
  comment  read the picture in file FILNAM into area of core whose first
		word is PICTURE. PFLDIM(FILNAM) words are needed.
		Returns picture size of success, 0 on failure.;
   BEGIN
   INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
   INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
   INTEGER I,L;
   INTEGER ARRAY BUF[0:'177];

   OPEN(10,DEV(FILNAM),'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
   LOOKUP(10,NAM(FILNAM),XXFLAG);
   IF XXFLAG THEN
       BEGIN
       CLOSE(10);
       RETURN(0);
       END
   ELSE
      BEGIN
      INTEGER K,KK;
      ARRYIN(10,BUF[0],10);
      IF BUF[0]=-1 THEN
         BEGIN
         ARRYIN(10,BUF[10],'200-10);
         KK←0;
         FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←K;
         IF KK=0 THEN
            BEGIN
            CLOSE(10);
            RETURN(0);
            END;
         L←LOCATION(PICTURE);
         MEMORY[L+9]←BYBI←BUF[1];
         MEMORY[L+5]←LNBY←BUF[6]-BUF[5]+1;
         MEMORY[L+0]←PCLN←BUF[4]-BUF[3]+1;
         MEMORY[L+7]←WDBY←36%BYBI;
         MEMORY[L+4]←LNWD←BUF[2];
         MEMORY[L+6]←LNBYA←LNWD*WDBY;
         MEMORY[L+1]←PCWD←PCLN*LNWD;
         MEMORY[L+2]←PCBY←PCLN*LNBY;
         MEMORY[L+3]←PCBYA←PCLN*LNBYA;
         MEMORY[L+8]←WDBI←WDBY*BYBI;
         MEMORY[L+10]←12+PCLN+L;
         MAKTAB(PICTURE);
         XXPICLOC←(BUF[KK] LAND '777777)-'200;
         FOR I←1 STEP 1 UNTIL XXPICLOC DO WORDIN(10);
         ARRYIN(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
         CLOSE(10);
         RETURN(12+PCLN+LNBYA+PCWD);
         END
      ELSE
         BEGIN   comment if old hand eye format;
         L←LOCATION(PICTURE);
         MEMORY[L+9]←BYBI←BUF[2];
         MEMORY[L+5]←LNBY←BUF[8]-BUF[7]+1;
         MEMORY[L+0]←PCLN←BUF[6]-BUF[5]+1;
         MEMORY[L+7]←WDBY←36%BYBI;
         MEMORY[L+4]←LNWD←(LNBY+WDBY-1)%WDBY;
         MEMORY[L+6]←LNBYA←LNWD*WDBY;
         MEMORY[L+1]←PCWD←PCLN*LNWD;
         MEMORY[L+2]←PCBY←PCLN*LNBY;
         MEMORY[L+3]←PCBYA←PCLN*LNBYA;
         MEMORY[L+8]←WDBI←WDBY*BYBI;
         MEMORY[L+10]←12+PCLN+L;
         IF BYBI≤0 ∨ BYBI>36 ∨ LNBY≤0 ∨ PCLN≤0 ∨ BUF[0]<0 THEN
            BEGIN
            CLOSE(10);
            RETURN(0);
            END;
         MAKTAB(PICTURE);
         ARRYIN(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
         CLOSE(10);
         RETURN(12+PCLN+LNBYA+PCWD);
         END;
      END;
   END;
internal INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS);
  comment  returns the size of the array needed to hold a hypothetical
		picture HEIGHT scanlines by WIDTH pixels per scanline
		by BITS bits per pixel.;
 BEGIN
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER L;
 BYBI←BITS;
 LNBY←WIDTH;
 PCLN←HEIGHT;
 WDBY←36%BYBI;
 LNWD←(LNBY+WDBY-1)%WDBY;
 LNBYA←LNWD*WDBY;
 PCWD←PCLN*LNWD;
 RETURN(12+PCLN+LNBYA+PCWD);
 END;

internal INTEGER PROCEDURE MAKPIX(INTEGER HEIGHT,WIDTH,BITS; REFERENCE INTEGER PICTURE);
  comment  actually creates an empty picture HEIGHT by WIDTH by BITS in
		the area of core beginning with PICTURE. Returns its size.;
 BEGIN
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER I,L;
 L←LOCATION(PICTURE);
 MEMORY[L+9]←BYBI←BITS;
 MEMORY[L+5]←LNBY←WIDTH;
 MEMORY[L+0]←PCLN←HEIGHT;
 MEMORY[L+7]←WDBY←36%BYBI;
 MEMORY[L+4]←LNWD←(LNBY+WDBY-1)%WDBY;
 MEMORY[L+6]←LNBYA←LNWD*WDBY;
 MEMORY[L+1]←PCWD←PCLN*LNWD;
 MEMORY[L+2]←PCBY←PCLN*LNBY;
 MEMORY[L+3]←PCBYA←PCLN*LNBYA;
 MEMORY[L+8]←WDBI←WDBY*BYBI;
 MEMORY[L+10]←12+PCLN+L;
 MAKTAB(PICTURE);
 RETURN(12+PCLN+LNBYA+PCWD);
 END;
 
internal INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE; STRING FILNAM);
  comment  write out the picture in the core area starting with
		PICTURE, creating a file called FILNAM. Returns
		the size of the original file on success, else 0.;
 BEGIN
 INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER I,L;
 INTEGER ARRAY BUF[0:'177];

 OPEN(10,DEV(FILNAM),'10,0,2,XXCOUNT,XXBRCHAR,XXEOF);
 ENTER(10,NAM(FILNAM),XXFLAG);
 IF XXFLAG THEN
  BEGIN
  CLOSE(10);
  RETURN(0);
  END
 ELSE
  BEGIN
  L←LOCATION(PICTURE);
  BUF[0]←-1;
  BUF[1]←BYBI←MEMORY[L+9];
  BUF[2]←LNWD←MEMORY[L+4];
  BUF[3]←1; BUF[4]←PCLN←MEMORY[L+0];
  BUF[5]←1; BUF[6]←LNBY←MEMORY[L+5];
  BUF[7]←((-(PCWD←MEMORY[L+1])) LSH 18) LOR '200;
  WDBY←36%BYBI;
  LNWD←(LNBY+WDBY-1)%WDBY;
  LNBYA←LNWD*WDBY;
  ARRYOUT(10,BUF[0],'200);
  ARRYOUT(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
  CLOSE(10);
  RETURN(12+PCLN+LNBYA+PCWD);
  END;
 END;


internal INTEGER PROCEDURE CAMPIX(INTEGER CAMRA,YEDGE,XEDGE,SUMS,CLPINC;
					REFERENCE INTEGER PICTURE);
    comment  read a picture from camera CAMRA of size defined by array PICTURE
                  the area of core beginning with PICTURE. Upper left hand
                  corner is at PICX,PICY. SUMS and CLPINC are averaging params.;
   BEGIN
   INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI,LINTAB;
   INTEGER L,CAM;
   EXTERNAL INTEGER ERROR,TVCAM;

   IF CAMRA>'40 THEN CAMRA←CAMRA LAND '67;
   IF CAMRA='41∨CAMRA='42 THEN CAM←CAMRA LAND 3 ELSE
      BEGIN
      INTEGER I,J;
      I←'401400000000 LOR LOCATION(J);
      J←IF CAMRA≥'40 THEN CAMRA LAND 7 ELSE 1 LSH (35-CAMRA);
         START_CODE
            MOVE    1,I;
            CALLI   1,'400070;       COMMENT VDSMAP;
            JUMP    0,0;
         END;
      CAM←3;
      END;

   L←LOCATION(PICTURE);
   PCLN←MEMORY[L+0];
   PCWD←MEMORY[L+1];
   LNWD←MEMORY[L+4];
   LNBY←MEMORY[L+5];
   LNBYA←MEMORY[L+6];
   BYBI←MEMORY[L+9];
   LINTAB←MEMORY[L+11];

   ERROR←1; TVCAM←CAM;

   IF SUMS>1 ∨ CLPINC<8 ∨ BYBI≠4 THEN
      BEGIN
     comment  use Quam's general picture taker;
      EXTERNAL PROCEDURE TVSIX(INTEGER ARRAY PARS; INTEGER SUMS,CLPINC);
      EXTERNAL PROCEDURE PICREL(INTEGER ARRAY PIC);
      DEFINE SCALEX="0",SCALEY="1",POSX="2",POSY="3",SIZEX="4",SIZEY="5",
          SIZEL="6",PTR="7",NAME="8",BIT="9",GAIN="10",OFFSET="11";
          comment  for interfacing quam internal format;
      INTEGER ARRAY PIC[0:15];
      PIC[POSX]←XEDGE; PIC[POSY]←YEDGE;
      PIC[BIT]←BYBI;
      PIC[SIZEX]←LNBY;
      PIC[SIZEY]←PCLN;
      PIC[SIZEL]←LNWD;
      TVSIX(PIC,SUMS,CLPINC);
      ARRBLT(MEMORY[LINTAB],MEMORY[PIC[PTR] LAND '777777],PCWD);
      PICREL(PIC);
      END
   ELSE
      BEGIN
      EXTERNAL PROCEDURE TVIN;
      EXTERNAL INTEGER BCLIP,TCLIP,FLINE,LLINE,LSIDE,RSIDE,TVWORD;
      BCLIP←7; TCLIP←0;
      FLINE←YEDGE; LLINE←FLINE+PCLN-1;
      LSIDE←XEDGE; RSIDE←LSIDE+LNBY-1;
      TVWORD←((-PCWD) LSH 18) LOR (LINTAB-1);
      TVIN;
      END;
   RETURN(12+PCLN+LNBYA+PCWD);
   END;
end